package main

import (
	"fmt"
	"math"
	"sort"
)

// 题目
// 类型： 双指针法的 变种的实现
//给定一个包括n 个整数的数组nums和 一个目标值target。找出nums中的三个整数，使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。


func threeSumClosest(nums []int, target int) int {
	res := 1000
	sort.Ints(nums)
	// 遍历第一个数
	for first:=0;first<len(nums);first++{
		//如何和前一个数相同，跳过
		if first > 0 && nums[first] == nums[first -1 ]{
			continue
		}
		// 遍历second 数字

		third := len(nums) -1

		for second:=first+1;second<len(nums) ;second++{
			// 第二数相同跳过
			if second > 1+first && nums[second] == nums[second - 1]  {
				continue
			}
			// 根据关系，选定second 后，修改third 指针；

			for second<third && nums[second]+nums[third]+nums[first] > target {
				third --
			}

			if third+1 <len(nums) && math.Abs(float64(res -target)) > math.Abs(float64(nums[second]+nums[first]+nums[third+1]-target )) {
				res = nums[second]+nums[first]+nums[third+1]
			}
				if second == third {
					break
				}
				if math.Abs(float64(res - target)) > math.Abs(float64(nums[second]+nums[first]+nums[third] -target)){
					res = nums[second]+nums[first]+nums[third]
				}
		}
	}
	return res
}


func main(){
	src := []int{-1,2,1,-4}
	target := 1
	fmt.Println(threeSumClosest(src,target))
}

